Grammar = {}    # 键值对：左边对应右边，将相同的左侧归于一个 ， 字典结构

Grammar_v2 = {}     # 加入序号的键值对

Vn = []  # 用来记录grammar的箭头左边部分，非终结符集

M = {}  # 预测分析表

Start_flag = 'root'     #开始标志，第一条文法

First = {}

First_str = {} # 仅在Before_analyse.py中有应用

Follow = {}


class ObtainGramar():
    def __init__(self):
        # 得到文法
        self.get_grammar()

        # 新结构的文法
        self.get_grammar_v2()

        pass

    def get_grammar(self):
        with open('./data/grammar.txt', 'r', encoding='utf-8') as f:
            it = f.readlines()
            for i, g in enumerate(it):
                if g[0] == '/':
                    continue
                g = g.partition('.')[2].strip().partition(' -> ')
                l, r = g[0], g[2]
                if 'GROUP BY' in r:
                    r = r.replace('GROUP BY', 'GROUPBY')
                if 'ORDER BY' in r:
                    r = r.replace('ORDER BY', 'ORDERBY')
                # 认为所有在左侧的都是非终结符 其他都是终结符
                if l not in Vn:
                    Vn.append(l)

                if Grammar.get(l) is not None:
                    Grammar[l].append(r)
                else:
                    Grammar[l] = [r]

    # 为什么要再提取一次呢？之前的提取没有编号，而且将左端相同的多条规则合并，这里不适用
    # 如果有时间会考虑修改，只提取一次
    def get_grammar_v2(self):
        with open('data/grammar.txt', 'r', encoding='utf-8') as f:
            for g in f.readlines():
                # 跳过注释
                if g[0] == '/':
                    continue
                tmp1 = g.partition('.')
                # 获得序号
                seqnum = tmp1[0]
                tmp2 = tmp1[2].strip().partition(' -> ')
                left = tmp2[0]
                right = tmp2[2]
                # 我真服了 这个GROUP BY和ORDER BY
                if 'GROUP BY' in right:
                    right = right.replace('GROUP BY', 'GROUPBY')
                if 'ORDER BY' in right:
                    right = right.replace('ORDER BY', 'ORDERBY')

                Grammar_v2[(left, seqnum)] = right
